home *** CD-ROM | disk | FTP | other *** search
/ HyperPC 2 / HyperPC 2 - Disc 1.iso / 18_厳選!オンラインソフト130 / セレクション / wavgp13c.lzh / wg / dllsrc.lzh / e1.cpp next >
C/C++ Source or Header  |  1999-04-14  |  6KB  |  276 lines

  1. #define  STRICT
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <commctrl.h>
  6. #include <mem.h>
  7. #include <math.h>
  8. #include "wg_data.h"
  9. #include "wg_back.h"
  10. #include "e1.rh"
  11.  
  12. #ifndef    EXIMPORT
  13. #define    EXIMPORT    _import
  14. #endif
  15.  
  16. #include "wgfunc.h"
  17.  
  18.  
  19. WGDATA wgData;
  20. HINSTANCE hDLL;
  21. int nResult;
  22.  
  23.  
  24. struct {
  25.   int time;   // 遅れ時間
  26.   int g;      // 減衰率
  27.   int n;      // 繰り返し回数
  28.   bool f;     // 対象 (f = false : 現在のチャンネル  true : 全てのチャンネル)
  29. } Info;
  30.  
  31.  
  32. extern "C" {
  33. int WINAPI _export ExecuteFunc(WGDATA *d);
  34. LPCSTR WINAPI _export WGInfo();
  35. }
  36.  
  37.  
  38.  
  39.  
  40. // ダイアログボックスの初期設定
  41. void InitDlg(HWND hwnd)
  42. {
  43.   InitCommonControls();
  44.  
  45.   short n = wgData.Current;
  46.   if (wgData.data[n-1].nChannels > 1) {
  47.     CheckDlgButton(hwnd,IDC_RADIOBUTTON2,1);
  48.   }
  49.   else {
  50.     EnableWindow(GetDlgItem(hwnd,IDC_RADIOBUTTON1),false);
  51.     EnableWindow(GetDlgItem(hwnd,IDC_RADIOBUTTON2),false);
  52.   }
  53. }
  54.  
  55.  
  56. // ダイアログボックスクローズ
  57. void EndDlg(HWND hwnd)
  58. {
  59.   Info.f = true;
  60.   if (IsDlgButtonChecked(hwnd,IDC_RADIOBUTTON1) == 1) Info.f = false;
  61.   if (wgData.data[wgData.Current-1].nChannels == 1) Info.f = false;
  62.  
  63.   BOOL flag;
  64.   Info.time = GetDlgItemInt(hwnd,IDC_EDIT1,&flag,true);
  65.   Info.g    = GetDlgItemInt(hwnd,IDC_EDIT2,&flag,true);
  66.   Info.n    = GetDlgItemInt(hwnd,IDC_EDIT3,&flag,true);
  67. }
  68.  
  69.  
  70.  
  71. #pragma argsused
  72. BOOL CALLBACK _export DlgDLLProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
  73. {
  74.   BOOL r = true;
  75.  
  76.   switch (msg) {
  77.  
  78.     case WM_INITDIALOG:
  79.       nResult = 0;
  80.       InitDlg(hwnd);
  81.       break;
  82.  
  83.     case WM_CLOSE:
  84.       EndDialog(hwnd,nResult);
  85.       break;
  86.  
  87.     case WM_COMMAND:
  88.       switch (LOWORD(wParam)) {
  89.         case IDOK:
  90.           nResult = IDOK;
  91.           EndDlg(hwnd);
  92.         case IDCANCEL:
  93.           PostMessage(hwnd,WM_CLOSE,0,0);
  94.           break;
  95.         default: r = false;
  96.       }
  97.       break;
  98.  
  99.     case WM_NOTIFY:
  100.       { // UpDown
  101.  
  102.       HWND hWnde = 0;
  103.       if ((int)wParam == IDC_MSCTLS_UPDOWN1) hWnde = GetDlgItem(hwnd,IDC_EDIT1);
  104.       if ((int)wParam == IDC_MSCTLS_UPDOWN2) hWnde = GetDlgItem(hwnd,IDC_EDIT2);
  105.       if ((int)wParam == IDC_MSCTLS_UPDOWN3) hWnde = GetDlgItem(hwnd,IDC_EDIT3);
  106.       if (!hWnde) break;
  107.  
  108.       char s[256];
  109.       NM_UPDOWN* ud = (NM_UPDOWN *)lParam;
  110.  
  111.       GetWindowText(hWnde,s,255);
  112.       int n = atoi(s);
  113.       n -= ud->iDelta;
  114.       if (n<0) n = 0;
  115.       sprintf(s,"%d",n);
  116.       SetWindowText(hWnde,s);
  117.       }
  118.       break;
  119.  
  120.     default: r = false;
  121.   }
  122.  
  123.   return(r);
  124. }
  125.  
  126.  
  127. int check(int d,WORD b)
  128. {
  129.   if (d < 0) d = 0;
  130.   if (b == 8) {
  131.     if (d > 255) d = 255;
  132.   }
  133.   else
  134.     if (d > 65535) d = 65535;
  135.  
  136.   return(d);
  137. }
  138.  
  139.  
  140. // エコー
  141. int effect()
  142. {
  143.   int r =  wgData.Current;
  144.  
  145.   WaveData* waveData[2];
  146.   WaveData* waveTmp;
  147.  
  148.   short c = wgData.Current;
  149.   c--;
  150.  
  151.   // 対象になる領域を決める
  152.   UINT x1 = wgData.data[c].x1;
  153.   UINT x2 = wgData.data[c].x2;
  154.   if (x1==x2) x2 = wgData.data[c].nData-1;
  155.  
  156.   // データを待避させるためのオブジェクト
  157.   waveTmp = new WaveData();
  158.   if (!waveTmp->Make(x2 - x1 + 1,
  159.                      wgData.data[c].nBits,
  160.                      1,
  161.                      wgData.data[c].nDataPerSec) ) {
  162.     delete waveTmp;
  163.     return 0;
  164.   }
  165.  
  166.   // WaveData クラスでデータを扱う
  167.   for (int i=0;i<=1;i++) {
  168.     waveData[i] = new WaveData();
  169.  
  170.     waveData[i]->data               = wgData.data[i].data;
  171.     waveData[i]->NumberOfData       = wgData.data[i].nData;
  172.     waveData[i]->NumberOfDataPerSec = wgData.data[i].nDataPerSec;
  173.     waveData[i]->NumberOfChannels   = wgData.data[i].nChannels;
  174.     waveData[i]->bit                = wgData.data[i].nBits;
  175.   }
  176.  
  177.   // 0
  178.   int average = (wgData.data[c].nBits == 8) ? 128 : 32768;
  179.  
  180.   // 処理するチャンネル
  181.   WORD ch1,ch2;
  182.   if (Info.f) {
  183.     ch1 = 0;
  184.     ch2 = waveData[c]->NumberOfChannels;
  185.     ch2--;
  186.   }
  187.   else {
  188.     ch1 = wgData.data[c].currentChannel;
  189.     ch1--;
  190.     ch2 = ch1;
  191.   }
  192.  
  193.   // Undoバッファに待避
  194.   WGBACK wgBack;
  195.   wgBack.n    = wgData.Current;
  196.   wgBack.fCh  = Info.f;
  197.   wgBack.x1   = x1;
  198.   wgBack.x2   = x2;
  199.   SendMessage(wgData.hwnd,WM_WG_BACK,0,(LPARAM)&wgBack);
  200.  
  201.  
  202.   // 処理
  203.   UINT time;
  204.   UINT xLate;
  205.   for (WORD ch=ch1;ch<=ch2;ch++) {
  206.     for (UINT i=x1;i<=x2;i++) {
  207.       waveTmp->DataWrite(i-x1,0,waveData[c]->DataRead(i,ch));
  208.     }
  209.     for (int n=1;n<=Info.n;n++) {
  210.       time = (UINT)( (double)Info.time * (double)waveData[c]->NumberOfDataPerSec / 1000.0);
  211.  
  212.       for (UINT i=x1;i<=x2;i++) {
  213.         xLate = i+time*n;
  214.         if (xLate > x2) break;
  215.  
  216.         waveData[c]->DataWrite(xLate,ch,
  217.                   check(waveData[c]->DataRead(xLate,ch) +
  218.                        (int)( (double)(waveTmp->DataRead(i-x1,0) - average)*pow((double)Info.g/100.0,n) ) ,
  219.                         waveData[c]->bit));
  220.       }
  221.     }
  222.   }
  223.  
  224.  
  225.   // 後片付け
  226.   for (int i=0;i<=1;i++) {
  227.     waveData[i]->data = 0; // 0にしておかないとデストラクタで削除される
  228.     delete waveData[i];
  229.   }
  230.   delete waveTmp;
  231.  
  232.  
  233.   return r;
  234. }
  235.  
  236.  
  237. // WaveGraphが実行する関数
  238. int WINAPI _export ExecuteFunc(WGDATA *d)
  239. {
  240.   int r = 0;
  241.  
  242.   // ダイアログボックス表示してエフェクトの条件を決める
  243.   memcpy(&wgData,d,sizeof(wgData));
  244.   DLGPROC dlgproc1 = (DLGPROC)MakeProcInstance(DlgDLLProc,hDLL);
  245.   if (DialogBox(hDLL,MAKEINTRESOURCE(IDD_DIALOG1),wgData.hwnd,dlgproc1)) {
  246.     HCURSOR hPrevious = SetCursor(LoadCursor(NULL,IDC_WAIT));
  247.     r = effect(); // 条件にしたがってエフェクトの処理を行う
  248.     SetCursor(hPrevious);
  249.   }
  250.   FreeProcInstance((FARPROC)dlgproc1);
  251.  
  252.  
  253.   // ExecuteFunc が終了したとき画面を更新するウインドウを指定
  254.   //
  255.   // r = 1 : Window1更新
  256.   // r = 2 : Window2更新
  257.   // r = 3 : 全て更新
  258.   return r;
  259. }
  260.  
  261.  
  262. // 処理の名前
  263. LPCSTR WINAPI _export WGInfo()
  264. {
  265.   return "エコー";
  266. }
  267.  
  268.  
  269. #pragma argsused
  270. BOOL WINAPI _export DllEntryPoint( HINSTANCE hinstDll, DWORD fdwRreason, LPVOID plvReserved)
  271. {
  272.   if ((fdwRreason == DLL_PROCESS_ATTACH) || (fdwRreason == DLL_THREAD_ATTACH)) hDLL = hinstDll;
  273.   return true;
  274. }
  275.  
  276.